#include <stdbool.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netdb.h>
#include <sys/un.h> 
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <netinet/in.h> 
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <ctype.h>


#include "constantes.h"
#include "estructuras.h"
#include "configuracion.h"
#include "sockets.h"
#include "CSCAN.h"
#include "estadisticas.h"
#include "consola.h"
#include "NIPC.h"



int numoletra(char letra);
void intacad ( int n , char* cadena);
char* Generar_Desc_ID ( void );

extern ListConfig * listaConfig;

int main(){
	
    char *buffer;		
    int i, respuesta, iEnv;
    int len;
    struct sockaddr_un remote;
	char* cadena;
	int Sock_consola;
	
	InfoIPC rInfoIPC;
	
	listaConfig = NULL;
	cargarConfig(); 	
	

	printf("\nCONSOLA INICIALIZADA\n");
	Sock_consola=crearSocket(AF_UNIX);
	printf("CONECTANDO CON EL PPD...\n");
	system("clear");
	remote.sun_family = AF_UNIX;
	strcpy(remote.sun_path, "sock_consola");
	len = strlen(remote.sun_path) + sizeof(remote.sun_family);
	if (connect(Sock_consola, (struct sockaddr *)&remote, len) == -1) {
        perror("connect");
        exit(1);
	}	
	printf("Conexion establecida entre Consola y PPD\n\n"); 
	   
	
	/*Para ir generando pedidos con sectores aleatorios*/
	int cont;
	cont=0;
	char *sNumeroGen=(char *)malloc (100);
	
	while(cont < 100){
		sleep(1);
		intacad(GenerarNumero(1,10000,10),sNumeroGen);
		generarStructIPC(sNumeroGen,READ_SECTOR_REQUEST,&rInfoIPC);
		enviarIPC(Sock_consola,&rInfoIPC);
		printf("CONSOLA----enviado %s \n",rInfoIPC.payload);
		printf("cont %i \n",cont);
		cont++;	
	} 
	
	rInfoIPC.payLoadLength=5;
	generarStructIPC("nada",FINPEDIDOS,&rInfoIPC);
	enviarIPC(Sock_consola,&rInfoIPC);
	
	/*
	instrucciones();
   
	comando = (char *) malloc(128);
	parametro =(char *)malloc (128);
   
	while (1) { 
	   		
		memset(comando,"\0",128);
		memset(parametro,"\0",128);
		
		read(STDIN_FILENO, comando, 128);

		if (separarComando() == ERROR)
			printf("Error al separar comando\n");
		
		
		i = ObtenerOrden(comando);
		
      
		switch(i){

			case(INFO):
				
				rInfoIPC.payLoadLength=128;
				generarStructIPC(parametro,INFO,&rInfoIPC);
				enviarIPC(Sock_consola,&rInfoIPC);
				break;
            
			case(CLEAN):
	
				rInfoIPC.payLoadLength=128;
				generarStructIPC(parametro,CLEAN,&rInfoIPC);
				enviarIPC(Sock_consola,&rInfoIPC);
				break;
					
           
			case(TRACE):
         
				rInfoIPC.payLoadLength=128;
				generarStructIPC(parametro,TRACE,&rInfoIPC);
				enviarIPC(Sock_consola,&rInfoIPC);
				break;
				

			case(READ):
				
				rInfoIPC.payLoadLength=128;
				generarStructIPC(parametro,READ,&rInfoIPC);
				enviarIPC(Sock_consola,&rInfoIPC);
				break;
         	
			
			case(WRITE):
			
				rInfoIPC.payLoadLength=128;
				generarStructIPC(parametro,WRITE,&rInfoIPC);
				enviarIPC(Sock_consola,&rInfoIPC);
				break;	  
	
			default:
				printf("Comando Invalido\n");
				break;
		}	
	}*/

}




int separarComando() {

	comando = strtok(comando," ");
	parametro = strtok(NULL,"\r\n\0");

	return EXITO;
}


int ObtenerOrden(char *parametro){
	
   int i;
	int j;
	bool flag = true;
	char *aux;
		
      
	for(i = 0; i<=4 ; i++) {
	
		aux = (char *) malloc (sizeof(orden[i]));
		memset(aux,"\0",sizeof(orden[i]));
		strncpy(aux, orden[i], strlen(orden[i]));
		j = 0;
		
		while(aux[j] == parametro[j] ){
			j++;
		}

		if( aux[j] == '\0' || aux[j] == "\0"|| (numoletra(aux[j])))
            return i;         
	}
	return -1;
}

int numoletra(char letra){
      
     if((isdigit(letra))||(isalpha(letra))) 
      return 0;
     
     return 1;   
}

void intacad ( int n , char* cadena)
{	
    int j=0;
    int i=0;
	char aux;

	do
    {
    cadena[i] = (n % 10) + '0';    
	n=n/10;
	i++;
	}while (n > 0);

    cadena[i] = '\0';
    i--;

	while(i>j)
	{
    aux=cadena[i];
	cadena[i]=cadena[j];
	cadena[j]=aux;
	i--;
	j++;
	}

}

char* Generar_Desc_ID ( void )
{
	static char ID [ 16 ] = "\0"; 
	unsigned int i;
	time_t tiempo;
	
	tiempo = time ( NULL );
	srand ((unsigned int) tiempo );
	for( i = 0 ; i < 16 ; i++ )
	{
		if((rand ( ) % 2) == 0)
		{
			ID [ i ] = 97 + rand ( ) % 25;
		}
		else
		{
			ID [ i ] = 48 + rand ( ) % 10;
		}
	}
   
	return ID;
}
